#include <cstdio>
#include <algorithm>
#include <cstring>
#define _clr(x,a) memset(x,a,sizeof(x));
using namespace std;
const int N=105;
const int INF=0x3f3f3f3f;
int t,n,m,a,b,w;
int g[N][N];
int low[N];
bool vis[N];
bool used[N][N];
int pre[N];
int path[N][N];
int prim(){
    int pos=1;
    int Min=INF;
    int ans=0;
    for(int i=1;i<=n;i++){
        if(i!=pos){
            low[i]=g[pos][i];
        }
        pre[i]=pos;
    }
    vis[pos]=true;
    pre[pos]=-1;
    for(int i=1;i<n;i++){
        Min=INF;
        for(int j=1;j<=n;j++){
            if(!vis[j] && low[j]<Min){
                Min=low[j];
                pos=j;
            }
        }
        if(Min==INF){
            return -1;
        }
        ans+=Min;
        vis[pos]=true;
        used[pos][pre[pos]]=used[pre[pos]][pos]=true;
        for(int j=1;j<=n;j++){
            if(vis[j] && j!=pos){
                path[j][pos]=path[pos][j]=max(path[j][pre[pos]],low[pos]);
            }
            if(!vis[j] && low[j]>g[pos][j]){
                low[j]=g[pos][j];
                pre[j]=pos;
            }
        }
    }
    return ans;
}
int second_tree(int ans){
    int res=INF;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(i!=j && !used[i][j]){
                res=min(res,ans-path[i][j]+g[i][j]);
            }
        }
    }
    return res;
}
void init(){
    _clr(g,INF);
    for(int i=1;i<=n;i++){
        g[i][i]=0;
    }
    _clr(vis,false);
    _clr(used,false);
    _clr(path,0);
    _clr(low,0);
}
int main(void){
    //freopen("data.txt","r",stdin);
    scanf("%d",&t);
    while(t--){
        init();
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++){
            scanf("%d%d%d",&a,&b,&w);
            g[a][b]=g[b][a]=w;
        }
        int ans=prim();
        int res=second_tree(ans);
        if(ans==res){
            printf("Not Unique!\n");
        }
        else{
            printf("%d\n",ans);
        }
    }
    return 0;
}
